//给定一个字符串数组 arr，字符串 s 是将 arr 某一子序列字符串连接所得的字符串，如果 s 中的每一个字符都只出现过一次，那么它就是一个可行解。 
//
// 请返回所有可行解 s 中最长长度。 
//
// 
//
// 示例 1： 
//
// 输入：arr = ["un","iq","ue"]
//输出：4
//解释：所有可能的串联组合是 "","un","iq","ue","uniq" 和 "ique"，最大长度为 4。
// 
//
// 示例 2： 
//
// 输入：arr = ["cha","r","act","ers"]
//输出：6
//解释：可能的解答有 "chaers" 和 "acters"。
// 
//
// 示例 3： 
//
// 输入：arr = ["abcdefghijklmnopqrstuvwxyz"]
//输出：26
// 
//
// 
//
// 提示： 
//
// 
// 1 <= arr.length <= 16 
// 1 <= arr[i].length <= 26 
// arr[i] 中只含有小写英文字母 
// 
// Related Topics 位运算 回溯算法 
// 👍 68 👎 0

package com.leetcode.editor.cn;

import java.util.List;

//Java：串联字符串的最大长度
class P1239MaximumLengthOfAConcatenatedStringWithUniqueCharacters {
    public static void main(String[] args) {
        Solution solution = new P1239MaximumLengthOfAConcatenatedStringWithUniqueCharacters().new Solution();
        // TO TEST
        List<String> arr = List.of("a", "abc", "d", "de", "def");
        System.out.println(solution.maxLength(arr));
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        int maxLen = 0;

        public int maxLength(List<String> arr) {
            dfs(arr, 0, 0, 0);
            return maxLen;
        }

        private void dfs(List<String> arr, int index, int ck, int tempMax) {
            if (index == arr.size()) {
                maxLen = Math.max(maxLen, tempMax);
                return;
            }
            String str = arr.get(index);
            int tempCk = getCk(ck, str);
            if (tempCk != -1) {
                dfs(arr, index + 1, tempCk, tempMax + str.length());
            }
            dfs(arr, index + 1, ck, tempMax);
        }

        private int getCk(int ck, String str) {
            char[] chars = str.toCharArray();
            for (char c : chars) {
                int tempInt = c - 'a';
                if ((ck & (1 << tempInt)) != 0) {
                    return -1;
                }
                ck = ck | (1 << tempInt);
            }
            return ck;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}